package com.wr;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

// 线程池

/**
 * 拒绝策略：队列加最大线程是最大可执行数量
 * 1、new ThreadPoolExecutor.AbortPolicy()  如果超过则不处理，抛出异常
 * 2、new ThreadPoolExecutor.CallerRunsPolicy()  哪里来回哪去，比如main线程调用的 就用main线程执行
 * 3、new ThreadPoolExecutor.DiscardPolicy()  如果超过则不处理，不抛出异常
 * 4、new ThreadPoolExecutor.DiscardOldestPolicy()  如果超过则去和最早的那个线程竞争，如果他结束了就执行，否则放弃，不抛出异常
 */
public class ThreadPoolDemo08 {
    public static void main(String[] args) {

        /**
         * 最大线程数如何定义
         * 1、cpu密集型：cpu几核就用集合 ，用代码获取cpu核数  Runtime.getRuntime().availableProcessors();
         * 2、IO密集型：程序中大型任务多，IO占很多资源  那么我们就设置大于这个任务的数量（一般两倍）
         */
//        System.out.println(Runtime.getRuntime().availableProcessors());
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,      // 核心线程数，常驻线程多少个
                5,  // 最大线程数  CPU密集型写法：Runtime.getRuntime().availableProcessors();
                3,  // 空闲线程销毁时间  与后面的参数组成时间
                TimeUnit.SECONDS,   // 是前面一个参数的单位
                new LinkedBlockingQueue<>(300),  //  存放任务的队列
                Executors.defaultThreadFactory(),  // 使用默认的线程生产工厂
                new ThreadPoolExecutor.DiscardOldestPolicy()  // 拒绝策略

        );  // 7个参数


        try {
            Future<AtomicInteger> submit = null;
            AtomicInteger atomicInteger = new AtomicInteger();
            for (int i = 0; i < 100; i++) {
//                threadPoolExecutor.execute(()->{
//                    System.out.println(Thread.currentThread().getName()+"->OK");
//                });

                submit = threadPoolExecutor.submit(() -> {
                    atomicInteger.getAndAdd(1);
                }, atomicInteger);
            
            }
            System.out.println(submit.get());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 线程池用完，程序结束，关闭线程池
            threadPoolExecutor.shutdown();
        }
    }
}
